﻿using System;
using System.Linq;
using System.Collections.Generic;
using SIM.Geo.DA;
using SIM.Geo.BE;
using System.Transactions;

namespace SIM.Geo.BL
{
    public class BLAvanceDiario
    {
        #region Metodos
        /// <summary>
        /// Método que devuelve la lista de AvanceDiario
        /// </summary>
        /// <returns></returns>
        public List<AvanceDiario> ListarAvanceDiario()
        {
            return Accesor.ListarAvanceDiario();
        }
        /// <summary>
        /// Método para insertar una AvanceDiario
        /// </summary>
        /// <param name="AvanceDiario"></param>
        /// <returns></returns>
        public string InsertarAvanceDiario(AvanceDiario avanceDiario)
        {
            string retorno = "Registrado";
            int codigo = 0;

            if (this.ExisteOtrasMaquinasPorPerforistaYFecha(avanceDiario.CodigoPerforista, avanceDiario.Fecha, avanceDiario.CodigoMaquina))
            {
                retorno = "PERFORISTA no puede trabajar en más de una máquina en la misma fecha: " + avanceDiario.Fecha.ToShortDateString();
                return retorno;
            }

            avanceDiario.CodigoAvanceDiario = Accesor.GenerarCodigoAvanceDiario(avanceDiario.Anio, avanceDiario.Mes);
            using (TransactionScope transaccion = new TransactionScope())
            {
                //Guarda los Avances diarios
                foreach (var item in avanceDiario.AvanceDiarioSonsajes)
                {
                    item.CodigoAvanceDiario = avanceDiario.CodigoAvanceDiario;
                    foreach (var detalle in item.DetallePerforacion)
                    {
                        detalle.CodigoAvanceDiario = avanceDiario.CodigoAvanceDiario;
                    }
                }


                //Guarda Ensumos
                foreach (var item in avanceDiario.Consumo)
                {
                    item.CodigoAvanceDiario = avanceDiario.CodigoAvanceDiario;
                }

                //Guarda Entubacion
                foreach (var item in avanceDiario.Entubacion)
                {
                    item.CodigoAvanceDiario = avanceDiario.CodigoAvanceDiario;
                }

                //Distribucion Trabajo
                foreach (var item in avanceDiario.DistribucionTrabajo)
                {
                    item.CodigoAvanceDiario = avanceDiario.CodigoAvanceDiario;
                }

                codigo = Accesor.InsertarAvanceDiario(avanceDiario);

                //Actualizo el contador de horometro de la maquina
                new DAMaquina().ModificarContadorHorometroMaquina(avanceDiario.CodigoMaquina, avanceDiario.FinHorometro);

                transaccion.Complete();
                
            }
            return retorno;
        }
        /// <summary>
        /// Método para modificar un AvanceDiario
        /// </summary>
        /// <param name="AvanceDiario"></param>
        public string ModificarAvanceDiario(AvanceDiario avanceDiario)
        {
            string retorno = "Registrado";
            using (TransactionScope transaccion = new TransactionScope())
            {
                //Primero elimino los detalles anteriores

                //Perforaciones
                DADetallePerforacion daDetallePerforacion = new DADetallePerforacion();
                var detallesPerforacion = daDetallePerforacion.ListarDetallePerforacion(avanceDiario.CodigoAvanceDiario);
                foreach (var item in detallesPerforacion)
                {
                    daDetallePerforacion.EliminarDetallePerforacion(item);
                }

                //Avance diario sondajes
                DAAvanceDiarioSonsajes daAvanceSondajes = new DAAvanceDiarioSonsajes();
                var avanceSondajes = daAvanceSondajes.ListarAvanceDiarioSonsajes(avanceDiario.CodigoAvanceDiario);
                foreach (var item in avanceSondajes)
                {
                    daAvanceSondajes.EliminarAvanceDiarioSonsajes(item);
                }

                //Elimino Consumo
                DAConsumo daConsumo = new DAConsumo();
                var consumos = daConsumo.ListarConsumo(avanceDiario.CodigoAvanceDiario);
                foreach (var item in consumos)
                {
                    daConsumo.EliminarConsumo(item);
                }

                //Elimino Entubacion
                DAEntubacion daEntubacion = new DAEntubacion();
                var entubaciones = daEntubacion.ListarEntubacion(avanceDiario.CodigoAvanceDiario);
                foreach (var item in entubaciones)
                {
                    daEntubacion.EliminarEntubacion(item);
                }

                //Elimino Distribucion
                DADistribucionTrabajo daDistribucion = new DADistribucionTrabajo();
                var distribuciones = daDistribucion.ListarDistribucionTrabajo(avanceDiario.CodigoAvanceDiario);
                foreach (var item in distribuciones)
                {
                    daDistribucion.EliminarDistribucionTrabajo(item);
                }

                //Modifico el AvanceDiario
                var avanceDiarioEdit = Accesor.ObtenerAvanceDiario(avanceDiario.CodigoAvanceDiario);
                avanceDiarioEdit.Fecha = avanceDiario.Fecha;
                avanceDiarioEdit.Turno = avanceDiario.Turno;
                avanceDiarioEdit.IniHorometro = avanceDiario.IniHorometro;
                avanceDiarioEdit.FinHorometro = avanceDiario.FinHorometro;
                avanceDiarioEdit.AvanceTotal = avanceDiario.AvanceTotal;
                avanceDiarioEdit.HorasOperacion = avanceDiario.HorasOperacion;
                avanceDiarioEdit.CodigoEmpresa = avanceDiario.CodigoEmpresa;
                avanceDiarioEdit.CodigoMaquina = avanceDiario.CodigoMaquina;
                avanceDiarioEdit.CodigoPerforista = avanceDiario.CodigoPerforista;
                avanceDiarioEdit.CodigoAyudante = avanceDiario.CodigoAyudante;
                avanceDiarioEdit.Descripcion = avanceDiario.Descripcion;
                avanceDiarioEdit.CodigoGeologo = avanceDiario.CodigoGeologo;

                avanceDiarioEdit.AvanceDiarioSonsajes = avanceDiario.AvanceDiarioSonsajes;
                avanceDiarioEdit.DistribucionTrabajo = avanceDiario.DistribucionTrabajo;
                avanceDiarioEdit.Consumo = avanceDiario.Consumo;
                avanceDiarioEdit.Entubacion = avanceDiario.Entubacion;
                avanceDiarioEdit.CantidadTotalHorasTrabajadas = avanceDiario.CantidadTotalHorasTrabajadas;

                Accesor.ModificarAvanceDiario(avanceDiarioEdit);

                transaccion.Complete();
            }

            return retorno;
        }
        /// <summary>
        /// Método para eliminar AvanceDiario
        /// </summary>
        /// <param name="AvanceDiario"></param>
        public void EliminarAvanceDiario(int codigoAvanceDiario)
        {
            //var avanceDiario = Accesor.ObtenerAvanceDiario(codigoAvanceDiario);
            //Accesor.EliminarAvanceDiario(avanceDiario);
            Accesor.EliminarAvanceDiario(codigoAvanceDiario);
        }

        /// <summary>
        /// Método que devuelve AvanceDiario por codigo
        /// </summary>
        /// <param name="codigoAvanceDiario"></param>
        /// <returns></returns>
        public AvanceDiario ObtenerAvanceDiario(int codigoAvanceDiario)
        {
            return Accesor.ObtenerAvanceDiario(codigoAvanceDiario);
        }

        /// <summary>
        /// Método que devuelve lista de AvanceDiario
        /// </summary>
        /// <param name="codigoAvanceDiario"></param>
        /// <returns></returns>
        public List<buscarAvanceDiario_Result> BuscarAvanceDiario(int codigoEmpresa, int codigoMaquina, string anio, string mes)
        {
            return Accesor.BuscarAvanceDiario(codigoEmpresa, codigoMaquina, anio, mes);
        }

        /// <summary>
        /// Genera Codigo de Avance Diario
        /// </summary>
        /// <param name="anio"></param>
        /// <param name="mes"></param>
        /// <param name="codigoMaquina"></param>
        /// <returns></returns>
        public int GenerarCodigoAvanceDiario(string anio, string mes)
        {
            return Accesor.GenerarCodigoAvanceDiario(anio, mes);
        }

        /// <summary>
        /// Obtiene ultimo codigo de sondaje utilizado por Maquina
        /// </summary>
        /// <param name="anio"></param>
        /// <param name="mes"></param>
        /// <param name="codigoMaquina"></param>
        /// <returns></returns>
        public int ObtenerUltimoCodSondajeADiarioMaquina(int codigoMaquina)
        {
            return Accesor.ObtenerUltimoCodSondajeADiarioMaquina(codigoMaquina);
        }


        /// <summary>
        /// Obtiene ultimo Avance diario
        /// </summary>
        /// <param name="anio"></param>
        /// <param name="mes"></param>
        /// <param name="codigoMaquina"></param>
        /// <returns></returns>
        public obtenerUltimoAvanceMaquina_Result ObtenerUltimoAvanceMaquina(int codigoMaquina)
        {
            return Accesor.ObtenerUltimoAvanceMaquina(codigoMaquina);
        }

        /// <summary>
        /// Retorna la lista de AvanceDiario por Codigo
        /// </summary>
        /// <param name="anio"></param>
        /// <param name="mes"></param>
        /// <param name="codigoMaquina"></param>
        /// <returns></returns>
        public List<repAvanceDiario_Result> ListarAvanceDiarioPorCodigo(int codigoAvanceDiario)
        {
            return Accesor.ListarAvanceDiarioPorCodigo(codigoAvanceDiario);
        }

        /// <summary>
        /// Devuelve la lista detalle de perforacion por Avance Diario
        /// </summary>
        /// <param name="codigoAvanceDiario"></param>
        /// <returns></returns>
        public List<repAvanceDiarioDetallePerforacion_Result> ListarDetalleAvancePerforacionPorAvanceDiario(int codigoAvanceDiario)
        {
            return Accesor.ListarDetalleAvancePerforacionPorAvanceDiario(codigoAvanceDiario);
        }

        /// <summary>
        /// Devuelve la lista avance sondaje detalle de perforacion por Avance Diario
        /// </summary>
        /// <param name="codigoAvanceDiario"></param>
        /// <returns></returns>
        public List<repAvanceDiarioSondaje_Result> ListarReporteAvanceDiarioSondaje(int codigoAvanceDiario)
        {
            return Accesor.ListarReporteAvanceDiarioSondaje(codigoAvanceDiario);
        }

        /// <summary>
        /// Valida si existe maquinas registradas en la misma fecha para el mismo Perforista
        /// </summary>
        /// <param name="codigoPerforista"></param>
        /// <param name="fecha"></param>
        /// <param name="codigoMaquina"></param>
        /// <returns></returns>
        public bool ExisteOtrasMaquinasPorPerforistaYFecha(string codigoPerforista, DateTime fecha, int codigoMaquina)
        {
            bool retorno = false;
            var lista = Accesor.ListarOtrasMaquinasPorPerforistaYFecha(codigoPerforista, fecha, codigoMaquina);
            if (lista.Count > 0) retorno = true;
            return retorno;

        }
        #endregion

        #region Accesor
        private static DAAvanceDiario Accesor
        {
            [System.Diagnostics.DebuggerStepThrough]
            get { return new DAAvanceDiario(); }
        }
        #endregion
    }
}
